/**
 * 
 */
package ar.edu.utn.frgp.banco.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import ar.edu.utn.frgp.banco.dao.ClienteDao;
import ar.edu.utn.frgp.banco.dao.connection.ConnectionHandler;
import ar.edu.utn.frgp.banco.dao.connection.IConnectionHandler;
import ar.edu.utn.frgp.banco.domain.Cliente;
import ar.edu.utn.frgp.banco.exceptions.DataAccessException;
import ar.edu.utn.frgp.banco.exceptions.PersonalisedException;

/**
 * @author PROFESOR
 *
 */
public class ClienteDaoImpl extends GenericDaoImpl implements ClienteDao {

	/* (non-Javadoc)
	 * @see ar.edu.utn.frgp.banco.dao.ClienteDao#altaCliente(ar.edu.utn.frgp.banco.domain.Cliente)
	 */
	@Override
	public void altaCliente(Cliente cliente) throws DataAccessException {

		PreparedStatement ps = null;
		
		IConnectionHandler handler = new ConnectionHandler();
		Connection cn = handler.getConnection();
		
		try {
			ps = cn.prepareStatement("INSERT INTO CLIENTES (DNI, NOMBRE, APELLIDO, DIRECCION, EMAIL, CLAVE) VALUES(?,?,?,?,?,?)");
			
			ps.setString(1, cliente.getDni());
			ps.setString(2, cliente.getNombre());
			ps.setString(3, cliente.getApellido());
			ps.setString(4, cliente.getDireccion());
			ps.setString(5, cliente.getMail());
			ps.setString(6, cliente.getClave());
			
			ps.executeUpdate();
			
		} catch (SQLException e) {
			throw new DataAccessException("Error de acceso a datos.",e);
		} finally {
			handler.closeResources(ps, cn);
		}

	}

	/* (non-Javadoc)
	 * @see ar.edu.utn.frgp.banco.dao.ClienteDao#obtenerClientes()
	 */
	@Override
	public List<Cliente> obtenerClientes() throws DataAccessException {

		Statement st = null;
		ResultSet rs = null;
		
		List<Cliente> clientes = new ArrayList<Cliente>();
		
		IConnectionHandler handler = new ConnectionHandler();
		Connection cn = handler.getConnection();
		
		try {
			st = cn.createStatement();
			
			rs = st.executeQuery("SELECT * FROM Cliente");
			
			Cliente cl = null;
			while (rs.next()) {
				cl = new Cliente();
				
				cl.setDni(rs.getString("dni"));
				cl.setNombre(rs.getString("nombre"));
				cl.setApellido(rs.getString("apellido"));
				cl.setDireccion(rs.getString("direccion"));
				cl.setMail(rs.getString("email"));
				
				clientes.add(cl);
			}
			
		} catch (SQLException e) {
			throw new DataAccessException("Error de acceso a datos.",e);
		} finally {
			handler.closeResources(rs, st, cn);
		}
		
		return clientes;
	}

	@Override
	public Cliente obtenerCliente(String dni) throws DataAccessException, PersonalisedException {
		Cliente cliente = null;
		
		Connection con = null;
		
		PreparedStatement st = null;
		ResultSet rs = null;
		try {
			con = getConection();
			st = con.prepareStatement("SELECT nombre,apellido,direccion,email,clave FROM CLIENTES c WHERE DNI = ?");

			st.setString(1, dni);
			
			rs = st.executeQuery();
			
			if (rs.next()){
				cliente = new Cliente();
				
				cliente.setDni(dni);
				cliente.setNombre(rs.getString(1));
				cliente.setApellido(rs.getString(2));
				cliente.setDireccion(rs.getString(3));
				cliente.setMail(rs.getString(4));
				cliente.setClave(rs.getString(5));
			}


			
		} catch (Exception e) {
			e.printStackTrace();
			throw new PersonalisedException("No se puede obtener el cliente");
		} finally {
			closeResultSet(rs);
			closeStatement(st);
			closeConnection();
		}
		
		
		
		return cliente;
	}

}
